<?php
/**
 * @class		ManageUsersController
 * @ingroup		users_controllers
 * @brief		Controller của đối tượng User, bao gồm các phương thức điều khiển các luồng xử lý để quản lý đối tượng user
 * @author		BaoNN
 * @version		1.0
 * @date		2009-2010
 */
App::import('Model', 'users.User');
class ManageUsersController extends AppController {
	/**
	 @var $name
	 @brief Tên của controller
	 */
	var $name = 'ManageUsers';
	/**
	 @var $uses
	 @brief Tập hợp các model mà controller sử dụng
	 */
	var $uses = array('User', 'access_logs.AccessLog');
	
	/**
	 * Phương thức được sử dụng để thực hiện các xử lý trước khi bắt đầu 1 hành động
	 */
	function beforeFilter() {
		parent::beforeFilter();
		$this->AccessLog->currentUser = $this->user;
		
		$this->configs = $this->User->loadConfig(array(
			'configFilename'	=>	'users.config',
			'cacheName'			=>	'users.manage.configs'
		));
		$this->set('configs', $this->configs);
	}
	/**
	 * Phương thức index() dùng để liệt kê tất cả danh sách người dùng
	 * 
	 * @return Danh sách người dùng
	 */
	function index() {
		$this->User->Behaviors->attach('Containable');
		$this->paginate['User']['contain'] = array();
		$users = $this->paginate('User');
		$this->set('users',$users);
	}
	
	/**
	 * Phương thức add() được sử dụng để tạo mới một người dùng
	 * 
	 * @return Người dùng mới trong danh sách người dùng hoặc Ném ra lỗi nếu các điều kiện không hợp lệ
	 */
	function add() {
		if (empty($this->data)) {
			// load dữ liệu trong trường hợp phát sinh lỗi
			$this->__checkError('User');
		} else {
			// Kiểm tra xem có tồn tại username?
			// Nếu hàm findCount trả về 0 thì chưa tồn tại username
			try {
				$this->User->createUser($this->data);
				
				// write to access log
				$this->AccessLog->writeLog(__("Tạo thành viên mới ({$this->data['User']['username']})", true), __("Quản lý thành viên", true));
				
				$this->Session->setFlash(__('Thông tin thành viên đã được lưu thành công!', true), "flash_success");
				$this->redirect(
					array('plugin' => 'users', 'controller' => 'manage_users', 'action'=>'index')
				);
			} catch (Exception $ex) {
				$this->__setError('User');
				$this->Session->setFlash($ex->getMessage(), "flash_error");
				$this->redirect(
					array('plugin' => 'users', 'controller' => 'manage_users', 'action'=>'add')
				);
			}
		}
	}
	
	/**
	 * Phương thức edit($id) dùng để thay đổi thông tin cá nhân của người dùng
	 * 
	 * @param $id int [optional] Mã người dùng
	 * @return Thông báo đã thay đổi thành công hoặc Ném ra lỗi nếu các điều kiện không hợp lệ
	 */
	function edit($id = null) {
		
		// Trong trường hợp dữ liệu chưa gởi lên trả về thông tin nội dung người dùng
		if (empty($this->data)) {
			$this->User->Behaviors->attach('Containable');
			$this->User->contain();
			$this->data = $this->User->read(null, $id);
			
			// load dữ liệu trong trường hợp phát sinh lỗi
			$this->__checkError('User');
			
		} else {
			//debug($this->data);  exit;
            //Kiểm tra user có tồn tại kô
            if($this->User->find('count', array(
    			'conditions'	=> array(
    				"username" => $this->data['User']['username'])
    			))
    		){
                $this->Session->setFlash(__("Tên đăng nhập này đã tồn tại, xin vui lòng chọn lại tên đăng nhập khác!",true), "flash_error");
            }else{
    			// Trong trường hợp dữ liệu được gởi lên tiến hành chỉnh sửa thông tin người dùng
    			$user_id = $this->data['User']['id'];
    			try {
    				// Create Category Information
    				//$this->data = $this->User->validateData($this->data);
    				$this->User->set($this->data);
    				if($this->User->save($this->data)) {
    					$this->AccessLog->writeLog(__("Cập nhật thành viên ({$this->data['User']['username']})", true), __("Quản lý thành viên", true));
    					
    					$this->Session->setFlash(__('Thông tin thành viên đã được cập nhật thành công!', true), "flash_success");
    					$this->redirect(array('action' => 'index'));
    				};
    			} catch (Exception $ex) {
    				
    				// Bắt lỗi biệt lệ
    				$this->__setError('User');
    				$this->Session->setFlash($ex->getMessage());
    				$this->redirect(array(
    					'action'	=>	'edit',
    					$id
    				));
    			}
            }
		}
	}
	
	/**
	 * Phương thức delete($id) dùng để xóa tài khoản của một người dùng ra khỏi dữ liệu
	 * 
	 * @param $id int [optional] mã người dùng
	 * @return Thông báo đã xóa thành công hoặc Ném ra lỗi nếu các điều kiện không hợp lệ
	 */
	function delete($id = null) {
		
		// Kiểm tra, nếu giá trị mã người dùng được gán giá trị thì thực hiện tác vụ xóa
		if($id) {
			
			// Nếu mã người dùng có giá trị bằng giá trị của tài khoản đang đăng nhập thì báo lỗi
			if($id == $this->my_id){
				$this->Session->setFlash(__("Không thể xóa thành viên này. Bạn vui lòng thử lại!",true), "flash_error");
			}
			
			// Xóa tài khoản người dùng nếu thỏa mãn các điều kiện đã xét
			$user = $this->User->find('first', array(
				'contain'		=> array(),
				'conditions'	=> array('User.id' => $id)
			));
			if($this->User->delete($id)){
				$this->AccessLog->writeLog(__("Xóa thành viên ({$user['User']['username']})", true), __("Quản lý thành viên", true));

				$this->Session->setFlash(__('Thành viên đã được xóa thành công!',true), "flash_success");
			} else {
				$this->Session->setFlash(__('Không thể xóa thành viên này. Bạn vui lòng thử lại!',true), "flash_error");
			}
		}
		$this->redirect($this->referer());
	}
	
	/**
	 * Phương thức change_pass() dùng để thay đổi mật khẩu của người sử dụng
	 * 
	 * @return Xác nhận thay đổi mật khẩu thành công hoặc báo lỗi
	 */
	function change_pass() {
		$this->layout = 'ajax';
		
		// Mảng dùng để thông báo lỗi
		$json = array();
		
		// Trong trường hợp dữ liệu được gửi lên, tiến hành việc thay đổi mật khẩu
		Configure::write('debug', 0);
		if (!empty($this->data)) {
			try {
				
				// triệu gọi hàm adminChangePassword($user_id, $newPassword, $reNewPassword) trong Model User
				$this->User->adminChangePassword(
					$this->data['User']['id'], 
					$this->data['User']['new_password'],
					$this->data['User']['re_new_password']				
				);
				
				$user = $this->User->find('first', array(
					'contain'		=> array(),
					'conditions'	=> array('User.id' => $this->data['User']['id'])
				));
				$this->AccessLog->writeLog(__("Đổi mật khẩu ({$user['User']['username']})", true), __("Quản lý thành viên", true));
				
				//$this->ajaxResult(1,__("Password has been updated successfull!.", true));
				$json['error'] = 0;
				$json['message'] = __("Mật khẩu đã được cập nhật thành công!", true);
				echo json_encode($json);
//				$this->redirect(array(
//					'plugin'		=> 'users',
//					'controller'	=> 'manage_users',
//					'action'		=> 'list_user'
//				));
				exit();
			} catch (Exception $ex) {
				
				// Ném ra lỗi biệt lệ
				$json['error'] = 1;
				$json['message'] = __($ex->getMessage(), true);
				echo json_encode($json);
				exit();
				//$this->ajaxResult(0, $ex->getMessage());
			}
			exit;
		}
		$this->data['User']['id'] = $user_id;
	}
	
	function mass_delete() {
		$checkboxes = array();
		if (isset($_POST['checkbox_index'])) {
			$checkboxes = $_POST['checkbox_index'];
		}
		if (count($checkboxes) > 0) {
			$users = $this->User->find('list', array(
				'fields'	=>	array('id', 'username'),
				'contain'		=> array(),
				'conditions'	=> array('User.id' => $checkboxes)
			));
			
			$this->User->deleteAll(array(
				'User.id'	=> $checkboxes
			));
			
			
			$this->AccessLog->writeLog(sprintf(__("Xóa các thành viên (%s)", true), implode(", ", $users)), __("Quản lý thành viên", true));

			$this->Session->setFlash(__("Các thành viên mà bạn chọn đã được xóa thành công!", true), "flash_success");
			$this->redirect(array(
				'action'	=>	'index'
			));
		} else {
			$this->Session->setFlash(__("Bạn vui lòng chọn các thành viên cần xóa", true), "flash_error");
			$this->redirect(array(
				'action'	=>	'index'
			));
		}
	}
}
?>